package com.jade.journal.desc.field;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

/**
 * 矩阵头信息描述
 *
 * @author fengyun
 * @version Jan 10, 2003 2:31:46 PM
 */
public class Fields
{
    /** 字段 */
    private List<Field> fields;

    /** 构造空的头信息 */
    public Fields()
    {
        fields = new ArrayList<Field>(8);
    }

    /**
     * 构造头信息
     *
     * @param fields
     */
    public Fields(List<Field> fields)
    {
        this.fields = fields;
    }

    /**
     * 设置字段列表
     *
     * @param fields
     */
    public void setFields(List<Field> fields)
    {
        this.fields = fields;
    }

    /** 添加字段 */
    public void addField(Field field)
    {
        if (fields == null) {
            fields = new ArrayList<Field>();
        }
        field.setIndex(fields.size());
        fields.add(field);
    }

    /**
     * 返回所有字段
     *
     * @return 所有字段列表
     */
    public List getFields()
    {
        return fields;
    }

    /**
     * 返回字段总数
     *
     * @return 字段总数
     */
    public int getFieldCount()
    {
        return fields.size();
    }

    /**
     * 根据索引返回字段
     *
     * @param index 字段索引
     * @return 根据索引返回字段
     */
    public Field getField(int index)
    {
        return (Field)fields.get(index);
    }

    /**
     * 根据字段名称返回字段
     *
     * @param name 字段名称
     * @return 返回字段，如果该名称的字段找不到，返回<code>null</code>
     */
    public Field getField(String name)
    {
        Field field = null;
        for (int i = 0; i < fields.size(); i++) {
            field = (Field)fields.get(i);
            if (name.equalsIgnoreCase(field.getName())) {//字段名称大小写无关
                return field;
            }
        }
        return field;
    }

    /**
     * 根据字段名称返回索引
     *
     * @param name 字段名称
     * @return 如果不存在返回<code>-1</code>
     */
    public int getFieldIndex(String name)
    {
        Field field = getField(name);
        return field != null ? field.getIndex() : -1;
    }

    /**
     * 根据字段名称返回索引
     *
     * @param index 字段索引
     * @return 字段名称
     */
    public String getFieldName(int index)
    {
        return getField(index).getName();
    }

    /**
     * 将字段头格式化成字符串
     *
     * @param sb
     * @param sep
     * @return 将字段头格式化成字符串
     */
    public StringBuilder format(StringBuilder sb, char sep)
    {
        for (int i = 0; i < fields.size(); i++) {
            if (i > 0) {
                sb.append(sep);
            }
            sb.append(fields.get(i));
        }
        return sb;
    }

    private transient char sep = '|';
    private transient String str = null;

    public String toString(char sep)
    {
        if (StringUtils.isNotBlank(str) || this.sep != sep) {
            StringBuilder sb = new StringBuilder(64);
            format(sb, sep);
            this.sep = sep;
            this.str = sb.toString();
        }
        return str;
    }

    public String toString()
    {
        return toString('|');
    }
}
